.NOLIST
#include "ion.inc"
#define levelmatrix		saferam1
#define pairs			saferam1+192
#define animationword		saferam1+321
#define selected		saferam1+340
#define cascade			saferam1+343
#define timebar			saferam1+346
#define matrixpos		saferam1+349
#define score			saferam1+351
#define animationvar		saferam1+353
#define playerpos		saferam1+355
#define screenpos		saferam1+357
#define greyframe		saferam1+358
#define mode			saferam1+359
#define animation		saferam1+360
#define level			saferam1+361

#define menuvar			greyframe
#define titlescreenupdown	greyframechange

#define kdown			1
#define kleft			2
#define kright			3
#define kup			4
#define kclear			15
#define kalpha			48
#define k2nd			54
#define kmode			55
.LIST
#ifdef TI83P
	.org progstart-2
	.db $BB,6D
#else
	.org progstart
#endif
	ret
	jr nc,begin
	.db "Benumbered v1.0",0
begin:

	set textwrite,(iy+sgrflags)
	set texterasebelow,(iy+textflags)
newgame:
	call titlescreen
	cp kclear
	jr z,quit
nextlevel:
	call loadlevel
	call drawsidebar
	ld a,39
	ld hl,levelawtext
	call animatedtext
	cp kclear
	jr z,quit
	cp kmode
	jr z,newgame
	call droplevel
	cp kclear
	jr z,quit
	cp kmode
	jr z,newgame
gameloop:
	call drawlevel
	call dispscreen
	call checkformove
	cp kalpha
	call z,deselect
	cp k2nd
	call z,select
	cp kmode
	jr z,newgame
	cp kclear
	jr z,quit
	ld a,(timebar)
	sub 52
	jr nz,gameloop
	ld hl,level
	inc (hl)
	jr nextlevel
quit:
	res textwrite,(iy+sgrflags)
	res texterasebelow,(iy+textflags)
	ret

titlescreen:
	xor a
	ld hl,saferam1
	ld (hl),a
	ld de,saferam1+1
	ld bc,level-saferam1
	ldir
	inc (hl)
titlescreenloop:
	bcall(_grbufclr)
	ld bc,72
	ld hl,title
	ld de,plotsscreen+12
	ldir
	dec c
	ld hl,plotsscreen+96
	ld b,12
titlescreenlineloop:
	ld (hl),c
	inc hl
	djnz titlescreenlineloop
	ld c,12
	ex de,hl
	add hl,bc
	ld de,plotsscreen+300
	ldir
	ld hl,modetext
	ld de,256*10+2
	call disptext
	ld de,256*17+2
	call disptext
	ld de,256*27+2
	call disptext
	ld a,(menuvar)
	call atimesseven
	add a,10
	ld d,a
	ld e,36
	ld (pencol),de
	ld a,$CF
	bcall(_vputmap)
	ld hl,ontext
	ld a,(animation)
	or a
	jr z,dispanimationtext
	ld hl,offtext
dispanimationtext:
	ld de,256*17+40
	call disptext
	ld a,(menuvar)
	or a
	call nz,drawleftarrow
loadmodetext:
	ld hl,normaltext
	ld a,(mode)
	or a
	jr z,dispmodetext
	ld hl,timetrialtext
dispmodetext:
	ld de,256*10+40
	call disptext
	ld a,(menuvar)
	or a
	call z,drawleftarrow
disphighscores:
	ld b,4
disphighscoresloop:
	push bc
	ld a,9
	sub b
	call atimesseven
	ld d,a
	ld e,2
	call disptext
	ld a,75
	ld (pencol),a
	push hl
	call disp16bitvar
	pop hl
	inc hl
	inc hl
	pop bc
	djnz disphighscoresloop
	call dispscreen
	bcall(_getk)
	cp kdown
	call z,titlescreenupdown
	cp kleft
	call z,titlescreenleftright
	cp kright
	call z,titlescreenleftright
	cp kup
	call z,titlescreenupdown
	cp kclear
	ret z
	cp k2nd
	ret z
	jp titlescreenloop

drawleftarrow:
	ld a,$05
	bcall(_vputmap)
	ret

titlescreenleftright:
	ld hl,animation
	ld a,(menuvar)
	or a
	jr nz,toggleoption
	dec hl
	inc a
toggleoption:
	sub (hl)
	ld (hl),a
	ret

loadlevel:
	ld a,(mode)
	ld h,a
	ld l,a
	or a
	jr z,loadnormallevel
	call loadlevelscore
	ld h,a
	ld l,50
	bcall(_htimesl)
	ld a,26
loadnormallevel:
	ld (timebar),a
	ld (timebar+1),hl
	ld c,64
	ld hl,levelmatrix
loadlevelloop:
	ld b,7
	call ionrandom
	inc a
	ld (hl),a
	inc hl
	inc hl
	ld a,c
	dec a
	and 11111000b
	sub 63
	ld (hl),a
	inc hl
	dec c
	jr nz,loadlevelloop
eliminatepairsbigloop:
	call checkforpairs
	ret z
	ld hl,levelmatrix
	ld c,64
eliminatepairssmallloop:
	ld a,(hl)
	or a
	jr nz,finisheliminatepairssmallloop
	ld b,7
	call ionrandom
	inc a
	ld (hl),a
finisheliminatepairssmallloop:
	inc hl
	inc hl
	inc hl
	dec c
	jr nz,eliminatepairssmallloop
	jr eliminatepairsbigloop

drawsidebar:
	bcall(_grbufclr)
	ld hl,leveltext
	ld de,256*1+2
	call disptext
	ld de,256*49+2
	call disptext
	ld a,(level)
	call atimesseven
	ld (levelawtext+7),a
	ld b,0
	ld c,a
	ld ix,sprites
	add ix,bc
	ld c,2
	ld de,256*22+0
	call crz1spriteroutine
	call displayscore
	ld hl,plotsscreen+3
	ld de,12
	ld b,9
drawsidebarborderloop:
	inc (hl)
	add hl,de
	djnz drawsidebarborderloop
	ld (hl),241
	ld hl,plotsscreen+747
	ld (hl),241
	add hl,de
	inc (hl)
drawtimebar:
	ld hl,timebar
	ld c,(hl)
	ld a,52
	sub c
	ld b,a
	ld hl,plotsscreen+122
	ld de,11
	or a
	jr z,filltimebar
drawtimebarloop1:
	set 0,(hl)
	inc hl
	ld (hl),9
	add hl,de
	djnz drawtimebarloop1
	ld a,c
	or a
	ret z
filltimebar:
	ld b,c
	set 0,(hl)
	inc hl
	ld (hl),121
	add hl,de
	dec b
	ret z
drawtimebarloop2:
	set 0,(hl)
	inc hl
	ld (hl),185
	add hl,de
	djnz drawtimebarloop2
	ret

displayscore:
	ld hl,score
	ld de,256*56+2
	ld (pencol),de
	call disp16bitvar
	ret

droplevel:
	ld c,63
droplevelbigloop:
	push bc
	call drawlevel
	call dispscreen
	pop bc
	call checkformove
	cp kclear
	ret z
	cp kmode
	ret z
	ld hl,levelmatrix
	ld b,64
droplevelsmallloop:
	inc hl
	inc hl
	ld a,(hl)
	add a,c
	jr nz,droplevelfinishsmallloop
	inc (hl)
droplevelfinishsmallloop:
	inc hl
	djnz droplevelsmallloop
	dec c
	jr nz,droplevelbigloop
	ld a,53
	ld hl,goawtext
	call animatedtext
	ret

drawlevel:
	ld a,(greyframe)
	dec a
	call z,drawgreytiles
	call nz,clearscreen
	xor a
	ld (screenpos),a
	ld hl,levelmatrix
	ld (matrixpos),hl
drawlevelloop:
	ld hl,(matrixpos)
	ld a,(hl)
	call atimesseven
	inc hl
	ld d,(hl)
	inc hl
	ld e,(hl)
	inc hl
	ld (matrixpos),hl
	ld b,0
	ld c,a
	ld ix,sprites
	add ix,bc
	ld c,2
	ld hl,screenpos
	ld a,(hl)
	and 00000111b
	add a,4
	add a,a
	add a,a
	add a,a
	add a,d
	ld d,a
	ld a,(hl)
	and 00111000b
	add a,e
	ld e,a
	call crz1spriteroutine
	ld hl,screenpos
	inc (hl)
	ld a,(hl)
	sub 64
	jr nz,drawlevelloop
	ld hl,pairs
	ld a,(hl)
	or a
	jr z,drawplayer
	set textinverse,(iy+textflags)
	ld b,a
displayscores:
	push bc
	inc hl
	ld d,(hl)
	inc hl
	ld e,(hl)
	inc hl
	push hl
	ld (pencol),de
	ld a,$20
	bcall(_vputmap)
	call disp16bitvar
	pop hl
	inc hl
	pop bc
	djnz displayscores
	res textinverse,(iy+textflags)
drawplayer:
	ld ix,playersprite
	ld c,2
	ld hl,playerpos
	call putsprite
drawselected:
	ld hl,selected
	ld a,(hl)
	or a
	jr z,greyframechange
	ld ix,blacksprite
	ld c,3
	inc hl
	call putsprite
greyframechange:
	ld hl,greyframe
	ld a,1
	sub (hl)
	ld (hl),a
	ret

drawgreytiles:
	ld hl,plotsscreen
	ld de,4
	ld c,192
drawgreytilesbigloop:
	add hl,de
	ld b,8
drawgreytilessmallloop:
	ld (hl),d
	ld a,c
	rra
	rra
	rra
	add a,b
	bit 0,a
	jr nz,nogreytile
	dec (hl)
nogreytile:
	inc hl
	djnz drawgreytilessmallloop
	inc c
	jr nz,drawgreytilesbigloop
	ret

clearscreen:
	xor a
	ld c,4
	ld d,64
	ld hl,plotsscreen+4
clearscreenbigloop:
	ld b,8
clearscreensmallloop:
	ld (hl),a
	inc hl
	djnz clearscreensmallloop
	add hl,bc
	dec d
	jr nz,clearscreenbigloop
	ret

dispscreen:
	call ionfastcopy
	bit oninterrupt,(iy+onflags)
	ret z
	ei
	halt
	ld a,8
	out (3),a
	ld a,1
	out (3),a
	halt
	res oninterrupt,(iy+onflags)
	ret

checkformove:
	bcall(_getk)
	ld b,a
	ld hl,playerpos
	cp kleft
	jr z,leftup
	cp kright
	jr z,rightdown
	inc hl
	cp kdown
	jr z,rightdown
	cp kup
	jr z,leftup
	ret
leftup:
	ld a,(hl)
	or a
	ld a,b
	ret z
	dec (hl)
	ret
rightdown:
	ld a,(hl)
	sub 7
	ld a,b
	ret z
	inc (hl)
	ret

deselect:
	xor a
	ld (selected),a
	ret

select:
	ld bc,(playerpos)
	ld hl,selected
	ld a,(hl)
	or a
	jr nz,switchcheck
	inc (hl)
	ld (selected+1),bc
	ret
switchcheck:
	ld a,c
	inc hl
	sub (hl)
	add a,a
	add a,a
	add a,a
	ld d,a
	ld a,b
	inc hl
	sub (hl)
	add a,a
	add a,a
	add a,a
	ld e,a
	cp d
	jr z,deselect
	add a,d
	jr z,deselect
	ld a,d
	or a
	jr z,switchchecky
	cp -8
	jr z,switchchecky
	cp 8
	jr nz,deselect
switchchecky:
	ld a,e
	or a
	jr z,switchdo
	cp -8
	jr z,switchdo
	cp 8
	jr nz,deselect
switchdo:
	push bc
	push de
	call switch
	pop de
	pop bc
	cp kclear
	ret z
	cp kmode
	ret z
	push bc
	push de
	call checkforpairs
	pop de
	pop bc
	jr nz,newnumbers
	call switch
	ret
newnumbers:
	ld hl,levelmatrix+189
	ld b,64
newnumbersbigloop:
	ld a,(hl)
	or a
	jr nz,nextnewnumber
	inc hl
	inc hl
	ld a,(hl)
	dec hl
	dec hl
	or a
	jr nz,nextnewnumber
	ld a,b
	add a,7
	sra a
	sra a
	sra a
	ld c,a
	push hl
newnumberssmallloop:
	ld a,c
	dec a
	jr z,newrandomnumber
	ld de,-24
	add hl,de
	ld a,(hl)
	ld de,24
	add hl,de
	jr newnumber
newrandomnumber:
	ld d,b
	ld b,7
	call ionrandom
	ld b,d
	inc a
newnumber:
	ld (hl),a
	inc hl
	inc hl
	ld (hl),-8
	ld de,-26
	add hl,de
	dec c
	jr nz,newnumberssmallloop
	pop hl
nextnewnumber:
	dec hl
	dec hl
	dec hl
	djnz newnumbersbigloop
	ld a,(pairs)
	or a
	jr z,dropnewnumbers
	ld a,(cascade)
	ld hl,pairs
	add a,(hl)
	ld (cascade),a
	ld a,(hl)
	or a
	jr z,nocascadedefining
	ld b,a
cascadedefining:
	inc hl
	inc hl
	inc hl
	ld e,(hl)
	inc hl
	ld d,(hl)
	push hl
	ld hl,(cascade+1)
	add hl,de
	ld (cascade+1),hl
	ld hl,(score)
	add hl,de
	ld (score),hl
	ld hl,(timebar+1)
	add hl,de
	ld (timebar+1),hl
	pop hl
	djnz cascadedefining
nocascadedefining:
	call loadlevelscore
	ld hl,(timebar+1)
	call divhlbya
	ld h,52
	bcall(_htimesl)
	ld a,100
	call divhlbya
	ld a,l
	add a,12
	and 192
	jr z,timebarnotfull
	ld l,52
timebarnotfull:
	ld a,l
	ld (timebar),a
	ld de,256*40+2
	ld (pencol),de
	ld a,$2B
	bcall(_vputmap)
	ld hl,cascade+1
	call disp16bitvar
	call displayscore
	call drawtimebar
dropnewnumbers:
	ld c,8
dropnewnumbersbigloop:
	ld hl,levelmatrix+2
	ld b,64
dropnewnumberssmallloop:
	ld a,(hl)
	or a
	jr z,dropnextnewnumber
	inc (hl)
dropnextnewnumber:
	inc hl
	inc hl
	inc hl
	djnz dropnewnumberssmallloop
	push bc
	call drawlevel
	call dispscreen
	pop bc
	call checkformove
	cp kclear
	ret z
	cp kmode
	ret z
	dec c
	jr nz,dropnewnumbersbigloop
	xor a
	ld (pairs),a
	ld hl,levelmatrix
	ld b,64
checkformorenewnumbers:
	ld a,(hl)
	or a
	jr nz,checkfornextnewnumber
	inc c
checkfornextnewnumber:
	inc hl
	inc hl
	inc hl
	djnz checkformorenewnumbers
	ld a,c
	or a
	jp nz,newnumbers
	call checkforpairs
	jp nz,newnumbers
	ld hl,cascade
	ld c,(hl)
	ld (hl),a
	inc hl
	ld (hl),a
	inc hl
	ld (hl),a
	ld hl,plotsscreen+492
	ld de,10
	ld b,5
removecascadescore:
	xor a
	ld (hl),a
	inc hl
	ld (hl),a
	inc hl
	inc a
	ld (hl),a
	add hl,de
	djnz removecascadescore
	ld a,c
	and 252
	ret z
	ld a,32
	ld hl,excellentawtext
	call animatedtext
	ret

switch:
	call findmatrixpos
	ld a,(hl)
	push hl
	ld bc,(selected+1)
	call findmatrixpos
	ld b,(hl)
	ld (hl),a
	inc hl
	ld (hl),d
	inc hl
	ld (hl),e
	pop hl
	ld (hl),b
	inc hl
	xor a
	sub d
	ld (hl),a
	inc hl
	xor a
	sub e
	ld (hl),a
	call deselect
	ld c,8
switchbigloop:
	ld hl,levelmatrix
	ld b,64
switchsmallloop:
	call switchcheckformove
	call switchcheckformove
	inc hl
	djnz switchsmallloop
	push bc
	call drawlevel
	call dispscreen
	pop bc
	call checkformove
	cp kclear
	ret z
	cp kmode
	ret z
	dec c
	jr nz,switchbigloop
	ret

findmatrixpos:
	push de
	ld d,0
	ld e,b
	ld h,d
	ld l,e
	add hl,de
	add hl,de
	add hl,hl
	add hl,hl
	add hl,hl
	ld e,c
	add hl,de
	add hl,de
	add hl,de
	ld de,levelmatrix
	add hl,de
	pop de
	ret

switchcheckformove:
	inc hl
	ld a,(hl)
	or a
	ret z
	bit 7,a
	jr nz,switchincmove
	dec (hl)
	ret
switchincmove:
	inc (hl)
	ret

checkforpairs:
	xor a
	ld (pairs),a
	ld hl,levelmatrix
	ld c,8
checkforhorpairsbigloop:
	push bc
	ld b,8
checkforhorpairssmallloop:
	push hl
	ld a,b
	dec a
	and 6
	sub 6
	jr z,checkfornexthorpair
	ld de,-3
	ld a,(hl)
	add hl,de
	cp (hl)
	jr nz,checkfornexthorpair
	add hl,de
	sub (hl)
	jr nz,checkfornexthorpair
	ld c,a
	inc d
	ld e,3
	inc hl
	inc (hl)
	add hl,de
	inc (hl)
	add hl,de
	inc (hl)
defininghorpair:
	dec hl
	ld a,b
	dec a
	jr z,confirmhorpair
	ld a,(hl)
	add hl,de
	cp (hl)
	jr nz,confirmhorpair
	dec b
	inc c
	inc hl
	inc (hl)
	jr defininghorpair
confirmhorpair:
	ld a,c
	add a,a
	add a,c
	ld e,a
	pop hl
	add hl,de
	ld a,12
	sub b
	ld e,a
	sub 2
	sub c
	add a,e
	add a,a
	add a,a
	ld e,a
	ld a,b
	ld d,c
	pop bc
	push bc
	push hl
	ld b,a
	ld a,8
	sub c
	ld c,d
	add a,a
	add a,a
	add a,a
	ld d,a
	call savepair
checkfornexthorpair:
	pop hl
	inc hl
	inc hl
	inc hl
	djnz checkforhorpairssmallloop
	pop bc
	dec c
	jr nz,checkforhorpairsbigloop
	ld hl,levelmatrix
	ld c,8
checkforverpairsbigloop:
	push bc
	ld b,8
checkforverpairssmallloop:
	push hl
	ld a,b
	dec a
	and 48
	sub 48
	jr z,checkfornextverpair
	ld de,-24
	ld a,(hl)
	add hl,de
	cp (hl)
	jr nz,checkfornextverpair
	add hl,de
	sub (hl)
	jr nz,checkfornextverpair
	ld c,a
	inc d
	ld e,24
	inc hl
	inc (hl)
	add hl,de
	inc (hl)
	add hl,de
	inc (hl)
definingverpair:
	dec hl
	ld a,b
	dec a
	jr z,confirmverpair
	ld a,(hl)
	add hl,de
	cp (hl)
	jr nz,confirmverpair
	dec b
	inc c
	inc hl
	inc (hl)
	jr definingverpair
confirmverpair:
	ld a,c
	add a,a
	add a,c
	add a,a
	add a,a
	add a,a
	ld e,a
	pop hl
	add hl,de
	ld a,b
	ld e,c
	pop bc
	push bc
	push hl
	ld b,a
	ld a,12
	sub c
	ld c,e
	add a,a
	add a,a
	add a,a
	ld e,a
	ld a,8
	sub b
	ld d,a
	sub 2
	sub c
	add a,d
	add a,a
	add a,a
	ld d,a
	call savepair
checkfornextverpair:
	pop hl
	ld de,24
	add hl,de
	djnz checkforverpairssmallloop
	ld de,-189
	add hl,de
	pop bc
	dec c
	jr nz,checkforverpairsbigloop
	ld hl,levelmatrix+1
	ld b,64
deleteallpairs:
	ld a,(hl)
	or a
	jr z,deletenextpair
	inc c
	xor a
	dec hl
	ld (hl),a
	inc hl
	ld (hl),a
deletenextpair:
	inc hl
	inc hl
	inc hl
	djnz deleteallpairs
	ld a,c
	or a
	ret

savepair:
	push bc
	ld hl,pairs
	ld a,(hl)
	add a,a
	add a,a
	inc (hl)
	inc hl
	push de
	ld b,0
	ld d,b
	ld e,a
	add hl,de
	pop de
	ld (hl),d
	inc hl
	ld (hl),e
	inc hl
	push hl
	ld hl,scorelist
	add hl,bc
	ld d,(hl)
	ld a,(cascade)
	ld hl,pairs
	add a,(hl)
	ld hl,scorelist-2
	ld c,a
	dec a
	and 248
	jr z,nomaximumbonus
	ld c,9
nomaximumbonus:
	add hl,bc
	ld a,d
	add a,(hl)
	ld l,a
	ld a,(level)
	inc a
	ld h,a
	bcall(_htimesl)
	ld a,(mode)
	dec a
	jr z,timetrialscore
	ld a,2
	bcall(_divhlbya)
timetrialscore:
	ex de,hl
	pop hl
	ld (hl),e
	inc hl
	ld (hl),d
	pop bc
	ret

animatedtext:
	call loadanimatedword
animatedtextloop:
	call drawlevel
	call animatedword
	call dispscreen
	call checkformove
	cp kclear
	ret z
	cp kmode
	ret z
	ld a,(animationvar)
	or a
	jr nz,animatedtextloop
	ret

loadanimatedword:
	ld b,(hl)
	ld c,32
	ld (animationvar),bc
	ld de,animationword
	ld (de),a
loadanimatedwordloop:
	inc hl
	inc de
	ld a,(hl)
	ld (de),a
	inc de
	ld a,b
	ld (de),a
	djnz loadanimatedwordloop
	ret

animatedword:
	ld bc,(animationvar)
	ld hl,animationword
	ld d,(hl)
	inc hl
animatedwordloop:
	push bc
	push de
	ld ix,sprites
	push hl
	inc hl
	ld a,(hl)
	ld c,a
	sub 9
	jr z,characterypos
	add a,10
characterypos:
	ld (hl),a
	ld hl,awtextpositions
	ld b,0
	add hl,bc
	ld e,(hl)
	push de
	ld c,1
	call crz1spriteroutine
	pop de
	pop hl
	ld c,(hl)
	inc hl
	inc hl
	ld ix,sprites
	add ix,bc
	pop af
	ld d,a
	add a,7
	push af
	push hl
	ld c,2
	call crz1spriteroutine
	pop hl
	pop de
	pop bc
	djnz animatedwordloop
	ld hl,animationvar
	dec (hl)
	ret

loadlevelscore:
	ld a,(level)
	ld b,0
	ld c,a
	ld hl,levelscores-1
	add hl,bc
	ld a,(hl)
	ret

divhlbya:
	ld d,11111111b
	neg
	ld e,a
	ld b,0
divhlbyaloop:
	ld a,h
	or a
	add hl,de
	jr nz,divhlbyaendloop
	ld a,h
	or a
	jr nz,dividedhlbya
divhlbyaendloop:
	inc b
	jr divhlbyaloop
dividedhlbya:
	ld l,b
	ret

atimesseven:
	ld b,a
	add a,a
	add a,b
	add a,a
	add a,b
	ret

disptext:
	ld (pencol),de
	bcall(_vputs)
	ret

disp16bitvar:
	ld a,(hl)
	inc hl
	ld h,(hl)
	ld l,a
	bcall(_setxxxxop2)
	bcall(_op2toop1)
	ld a,5
	bcall(_dispop1a)
	ret

putsprite:
	ld a,(hl)
	add a,4
	add a,a
	add a,a
	add a,a
	ld d,a
	inc hl
	ld a,(hl)
	add a,a
	add a,a
	add a,a
	ld e,a

crz1spriteroutine:
	ld b,8
	push bc
	xor a
	ld h,a
	ld l,a
	ld (crz1endshiftloop+1),a
	ld (crz1endshiftloop+10),a
	ld a,e
	dec b
crz1topoffcheck:
	inc a
	jp z,crz1topoff
	djnz crz1topoffcheck
	ld c,e
	add hl,bc
	add hl,bc
	add hl,bc
	add hl,hl
	add hl,hl
	ld a,e
	sub 56
	ld b,7
crz1bottomoffcheck:
	dec a
	jp z,crz1bottomoff
	djnz crz1bottomoffcheck
	jp crz1checkplayerpos
crz1topoff:
	push bc
	ld a,8
	sub b
	ld b,h
	ld c,a
	add ix,bc
	pop bc
crz1bottomoff:
	ld a,b
	pop bc
	ld b,a
	push bc
crz1checkplayerpos:
	ld a,d
	ld b,7
crz1leftoffcheck:
	inc a
	jp z,crz1leftoff
	djnz crz1leftoffcheck
	ld c,d
	srl c
	srl c
	srl c
	add hl,bc
	ld a,d
	sub 88
	ld b,7
crz1rightoffcheck:
	dec a
	jp z,crz1rightoff
	djnz crz1rightoffcheck
;	jp crz1finishscreenpos
crz1leftoff:
;	dec hl
;	inc a
crz1rightoff:
;	inc a
;	ld (crz1endshiftloop+1),a
;	ld (crz1endshiftloop+10),a
crz1finishscreenpos:
	ld bc,plotsscreen
	add hl,bc
	pop bc
	ld a,d
	and 00000111b
	jp z,crz1aligned
	ld (crz1nonaligned+6),a
crz1nonaligned:
	ld d,(ix+0)
	ld e,c
	dec e
	ld a,00h
	jp nz,crz1orxorshiftloop
	dec e
crz1andshiftloop:
	srl d
	rr e
	set 7,d
	dec a
	jp nz,crz1andshiftloop
	jp crz1endshiftloop
crz1orxorshiftloop:
	srl d
	rr e
	dec a
	jp nz,crz1orxorshiftloop
crz1endshiftloop:
	ld a,00h
	and 00000010b
	ld a,d
	call z,crz1putsprite
	inc hl
	ld a,00h
	and 00000001b
	ld a,e
	call z,crz1putsprite
	ld de,11
	add hl,de
	inc ix
	djnz crz1nonaligned
	ret
crz1aligned:
	ld a,(ix+0)
	call crz1putsprite
	ld de,12
	add hl,de
	inc ix
	djnz crz1aligned
	ret
crz1putsprite:
	ld d,c
	dec d
	jp z,crz1putand
	dec d
	jp z,crz1putor
	xor (hl)
	ld (hl),a
	ret
crz1putand:
	and (hl)
	ld (hl),a
	ret
crz1putor:
	or (hl)
	ld (hl),a
	ret

sprites:
	.db 00000000b
	.db 00000000b
	.db 00000000b
	.db 00000000b
	.db 00000000b
	.db 00000000b
	.db 00000000b
onesprite:
	.db 00000000b
	.db 00011000b
	.db 00111000b
	.db 00011000b
	.db 00011000b
	.db 00011000b
	.db 00111100b
twosprite:
	.db 00000000b
	.db 00111100b
	.db 01100110b
	.db 00000110b
	.db 00111100b
	.db 01100000b
	.db 01111110b
threesprite:
	.db 00000000b
	.db 00111100b
	.db 01100110b
	.db 00001100b
	.db 00000110b
	.db 01100110b
	.db 00111100b
foursprite:
	.db 00000000b
	.db 00001100b
	.db 00011100b
	.db 00101100b
	.db 01001100b
	.db 01111110b
	.db 00001100b
fivesprite:
	.db 00000000b
	.db 01111110b
	.db 01100000b
	.db 01111100b
	.db 00000110b
	.db 01100110b
	.db 00111100b
sixsprite:
	.db 00000000b
	.db 00111100b
	.db 01100000b
	.db 01111100b
	.db 01100110b
	.db 01100110b
	.db 00111100b
sevensprite:
	.db 00000000b
	.db 01111110b
	.db 00000110b
	.db 00001100b
	.db 00011000b
	.db 00011000b
	.db 00011000b
eightsprite:
	.db 00000000b
	.db 00111100b
	.db 01100110b
	.db 00111100b
	.db 01100110b
	.db 01100110b
	.db 00111100b
ninesprite:
	.db 00000000b
	.db 00111100b
	.db 01100110b
	.db 01100110b
	.db 00111110b
	.db 00000110b
	.db 00111100b
smallcsprite:
	.db 00000000b
	.db 00000000b
	.db 00111100b
	.db 01100110b
	.db 01100000b
	.db 01100110b
	.db 00111100b
bigesprite:
	.db 00000000b
	.db 01111110b
	.db 01100000b
	.db 01111000b
	.db 01100000b
	.db 01100000b
	.db 01111110b
smallesprite:
	.db 00000000b
	.db 00000000b
	.db 00111100b
	.db 01100110b
	.db 01111110b
	.db 01100000b
	.db 00111100b
biggsprite:
	.db 00000000b
	.db 00111100b
	.db 01100110b
	.db 01100000b
	.db 01101110b
	.db 01100110b
	.db 00111100b
smallisprite:
	.db 00000000b
	.db 00011000b
	.db 00000000b
	.db 01111000b
	.db 00011000b
	.db 00011000b
	.db 01111110b
biglsprite:
	.db 00000000b
	.db 01100000b
	.db 01100000b
	.db 01100000b
	.db 01100000b
	.db 01100000b
	.db 01111110b
smalllsprite:
	.db 00000000b
	.db 01111000b
	.db 00011000b
	.db 00011000b
	.db 00011000b
	.db 00011000b
	.db 01111110b
smallmsprite:
	.db 00000000b
	.db 00000000b
	.db 01111100b
	.db 01101010b
	.db 01101010b
	.db 01101010b
	.db 01101010b
bignsprite:
	.db 00000000b
	.db 01100110b
	.db 01110110b
	.db 01101110b
	.db 01100110b
	.db 01100110b
	.db 01100110b
smallnsprite:
	.db 00000000b
	.db 00000000b
	.db 01111100b
	.db 01100110b
	.db 01100110b
	.db 01100110b
	.db 01100110b
smallosprite:
	.db 00000000b
	.db 00000000b
	.db 00111100b
	.db 01100110b
	.db 01100110b
	.db 01100110b
	.db 00111100b
smallpsprite:
	.db 00000000b
	.db 00000000b
	.db 01111100b
	.db 01100110b
	.db 01100110b
	.db 01111100b
	.db 01100000b
smallssprite:
	.db 00000000b
	.db 00000000b
	.db 00111100b
	.db 01100000b
	.db 00111100b
	.db 00000110b
	.db 00111100b
bigtsprite:
	.db 00000000b
	.db 01111110b
	.db 00011000b
	.db 00011000b
	.db 00011000b
	.db 00011000b
	.db 00011000b
smalltsprite:
	.db 00000000b
	.db 00011000b
	.db 01111110b
	.db 00011000b
	.db 00011000b
	.db 00011000b
	.db 00001110b
smallusprite:
	.db 00000000b
	.db 00000000b
	.db 01100110b
	.db 01100110b
	.db 01100110b
	.db 01100110b
	.db 00111110b
smallvsprite:
	.db 00000000b
	.db 00000000b
	.db 01100010b
	.db 01100010b
	.db 00110100b
	.db 00110100b
	.db 00011000b
smallxsprite:
	.db 00000000b
	.db 00000000b
	.db 01100110b
	.db 01100110b
	.db 00111100b
	.db 01100110b
	.db 01100110b
exclamationmarksprite:
	.db 00000000b
	.db 00011000b
	.db 00111100b
	.db 00111100b
	.db 00011000b
	.db 00000000b
	.db 00011000b
	.db 00000000b
blacksprite:
	.db 11111111b
	.db 11111111b
	.db 11111111b
	.db 11111111b
	.db 11111111b
	.db 11111111b
	.db 11111111b
playersprite:
	.db 11111111b
	.db 10000001b
	.db 10000001b
	.db 10000001b
	.db 10000001b
	.db 10000001b
	.db 10000001b
	.db 11111111b

title:
	.db $7C,$00,$00,$00,$0C,$00,$00,$00,$0C,$00,$60,$3C
	.db $66,$79,$F3,$37,$CF,$8F,$3E,$3C,$7C,$C4,$E0,$66
	.db $7C,$CD,$9B,$36,$AC,$D9,$B3,$66,$CC,$C4,$60,$6E
	.db $66,$FD,$9B,$36,$AC,$DF,$B3,$7E,$CC,$68,$60,$76
	.db $66,$C1,$9B,$36,$AC,$D8,$30,$60,$CC,$68,$63,$66
	.db $7C,$79,$99,$F6,$AF,$8F,$30,$3C,$7C,$30,$F3,$3C
modetext:
	.db "Mode",0
animationtext:
	.db "Animation",0
highscorestext:
	.db "Highscores",0
ontext:
	.db "On",0
offtext:
	.db "Off",0
normaltext:
	.db "Normal",0
normalhighscores:
	.db "Cerzus69",0
	.dw 1000
	.db "Cerzus69",0
	.dw 750
	.db "Cerzus69",0
	.dw 500
	.db "Cerzus69",0
	.dw 250
timetrialtext:
	.db "Time Trial",0
timetrialhighscores:
	.db "Cerzus69",0
	.dw 500
	.db "Cerzus69",0
	.dw 375
	.db "Cerzus69",0
	.dw 250
	.db "Cerzus69",0
	.dw 125
leveltext:
	.db "Level",0
scoretext:
	.db "Score",0
scorelist:
	.db 2,4,6,10,14,20,30,40
levelscores:
	.db 1,2,4,8,16,32,64,128,255
awtextpositions:
	.db 26,27,28,29,30,30,29,28,27,26
levelawtext:
	.db 7,105,84,182,84,112,0,0
goawtext:
	.db 3,91,140,196
excellentawtext:
	.db 9,77,189,70,84,112,112,84,133,168
nomovesawtext:
	.db 9,126,140,0,119,140,182,84,154,196
timeupawtext:
	.db 7,161,98,119,84,0,175,147


.end
END